# -*- coding: utf-8 -*-

'''
@author: Artur Ataíde 11508, Pedro Fernandes 9634
@date: Outubro de 2012
Módulo que copia os dados pedidos do ficheiro excel e envia para
uma base de dados sqlite3
'''
import xlrd
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String,  create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

Base = declarative_base()
DBSession = scoped_session(sessionmaker())

lista_colunas = [0, 1, 2, 3, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37,
					40, 43, 47, 50, 53]	

class Matriculas(Base):
	'''
	Classe que permite criar a base de dados de nome Matriculas,
	com a tabela inscritos
	'''
	__tablename__ = "inscritos"	
	#Criação das diversas colunas da tabela da base de dados
	id = Column(Integer, primary_key=True)
	estab_ensino = Column(String(40))
	uni_org = Column(String(40))
	niv_form = Column(String(40))		
	curso = Column(String(40))             
	ano96 = Column(String(5))   
	ano97 = Column(String(5)) 
	ano98 = Column(String(5)) 
	ano99 = Column(String(5)) 
	ano00 = Column(String(5)) 
	ano01 = Column(String(5)) 
	ano02 = Column(String(5)) 
	ano02 = Column(String(5)) 
	ano03 = Column(String(5)) 
	ano04 = Column(String(5)) 
	ano05 = Column(String(5)) 
	ano06 = Column(String(5)) 
	ano07 = Column(String(5)) 
	ano08 = Column(String(5)) 
	ano09 = Column(String(5)) 
	ano10 = Column(String(5))
	ano11 = Column(String(5))
def abrir_ficheiro(caminho):	
	'''
	Método que recebe o caminho do ficheiro e abre o ficheiro
	tenta abrir o ficheiro, caso não consigo avisa que o ficheiro não foi 
	encontrado	
	@param caminho - string com o cmainho do ficheiro a abrir
	'''
	try:		 
		livro = xlrd.open_workbook(caminho)	
		folha = livro.sheet_by_name("Tabela 4.1")
		init_sqlalchemy()  
		criar_bd(folha)
	except IOError:
		print "O ficheiro não foi encontrado"
        
def init_sqlalchemy(dbname = 'sqlite:///Matriculas.db'):
	'''
	método que inicia o sqlalchemy e os seus mecanismos necessários para
	enviar os dados para a base de dados
	'''
   	global engine
   	engine = create_engine(dbname, echo=False)
   	DBSession.remove()
   	DBSession.configure(bind=engine, autoflush=False, expire_on_commit=False)
   	Base.metadata.drop_all(engine)
   	Base.metadata.create_all(engine)     	              
                          
def criar_bd(folha):	
	'''
	método que vai buscar ao ficheiro excel os campos especificados
	e coloca na base de dados através do sqlalchemy	
	@param folha - folha do excel a ser lida do ficheiro
	''' 	  
	sub_linhas = 9
	n_linhas_final = folha.nrows - sub_linhas
	n_linhas_ini = 4	
	engine.execute(
		Matriculas.__table__.insert(), 		
		[{"estab_ensino": get_non_blank(folha, i, lista_colunas[0]),		
		"uni_org": get_non_blank(folha, i, lista_colunas[1]),
		"niv_form": get_non_blank(folha, i, lista_colunas[2]),
		"curso": folha.cell_value(i,lista_colunas[3]),
		"ano96": folha.cell_value(i,lista_colunas[4]),
		"ano97": folha.cell_value(i,lista_colunas[5]),
		"ano98": folha.cell_value(i,lista_colunas[6]),
		"ano99": folha.cell_value(i,lista_colunas[7]),
		"ano00": folha.cell_value(i,lista_colunas[8]),
		"ano01": folha.cell_value(i,lista_colunas[9]),
		"ano02": folha.cell_value(i,lista_colunas[10]),
		"ano03": folha.cell_value(i,lista_colunas[11]),
		"ano04": folha.cell_value(i,lista_colunas[12]),
		"ano05": folha.cell_value(i,lista_colunas[13]),
		"ano06": folha.cell_value(i,lista_colunas[14]),
		"ano07": folha.cell_value(i,lista_colunas[15]),
		"ano08": folha.cell_value(i,lista_colunas[16]),
		"ano09": folha.cell_value(i,lista_colunas[17]),
		"ano10": folha.cell_value(i,lista_colunas[18]),
		"ano11": folha.cell_value(i,lista_colunas[19])}  for i in range(n_linhas_ini, n_linhas_final)]
		)	

def get_non_blank(folha, i, col):
	'''
	Método que retira os espaços brancos e vai buscar a ultima linha com
	string
	@param folha - folha do excel a ser lida do ficheiro
	@param i - numero da linha a ler
	@param col - numero da coluna a obter
	@return - retorna uma string que não esteja em branco
	'''
	if folha.cell(i, col).value == '':
		#Corta os espaços vazios
		while(folha.cell(i, col).value == ''):
			i-=1
		pass
		non_blank = folha.cell_value(i, col)
	else:
		non_blank = folha.cell_value(i, col)
	return non_blank		
